// 给定一个二叉树，找出其最小深度。
// 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
// 说明: 叶子节点是指没有子节点的节点。

// 暴露接口
function minDepth(root: TreeNode | null): number {
  if (!root) {
    // 递归出口：节点为空时返回 0
    return 0;
  }
  // 注意这个递归的设计
  return root.left && root.right
    ? Math.min(minDepth(root.left), minDepth(root.right)) + 1
    : Math.max(minDepth(root.left), minDepth(root.right)) + 1;
}


// 这道题目是一道比较简单的递归设计题目，但是内含有坑。
// 我们思考一个这样的问题：根节点为 1 ，左叶节点为 2 的时候的最小深度是多少
// 如果按照常规直观的递归设计思路，最后算出来的结果很可能是 1，
// 因为结点1的右子节点深度计算出来为 0，而根节点 1 不是叶节点，它的最小深度不算
// 而实际上，节点2才是符合要求的节点。所以不能单纯的递归比较2个子节点谁的深度小
// 故我们应该分两种情况讨论，即：
// 1、当前节点的左右节点存在，返回较小的孩子节点深度
// 2、若当前节点的左右子节点中有一个不存在，，则说明当前节点的子节点中的一个存在叶子节点，
// 故返回不为空的孩子节点（较大的那个）的深度
// 3、若不存在左右子节点，说明走到递归出口，返回 0 。